package main

import (
	"btcionshow/ch01-test01/utils"
	"bytes"
	"strconv"
	"time"
)

/**
 * @author: SuZhiXiaoWei
 * @DateTime: 2022/2/21 11:03
 **/
//区块结构体
type Block struct {
	PrevHash []byte //上一个区块hash
	TimeStamp int64  //时间戳
	Data []byte     //数据
	Hash []byte    //hash值
	Nonce int64   //随机数
}
/*
1.获取当前区块的哈希值
2.由上一个区块hash值，数据data，和时间戳拼接 再加上随机数
*/
func (block *Block)getBlockHash()[]byte{
	//将int类型转为string类型
	time := []byte( strconv.FormatInt(block.TimeStamp, 10))
	random := []byte( strconv.FormatInt(block.Nonce, 10))
	//拼接字符串 第一个参数要拼接的内容，第二个是以什么形式拼接
	hash := bytes.Join([][]byte{block.PrevHash, block.Data, time,random}, []byte{})
	return utils.GetHash(hash)
}
//创建新的区块
func NewBlock(data []byte,prevHash []byte) *Block{
	block := Block{
		PrevHash: prevHash,
		TimeStamp: time.Now().Unix(),
		Data: data,
	}
	pow := NewPow(&block)
	hash, nonce := pow.Run()
	block.Hash = hash
	block.Nonce = nonce
	return &block
}
//创世区块
func GenesisBlock(data []byte)*Block{
	genesis := NewBlock(data, nil)
	return genesis
}

